home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 68K / Lib / img / imgsgi.py < prev   
Text File  |  1996-05-20  |  3KB  |  128 lines

  1. """
  2. Read and write SGI image files using the 'rgbimg' module
  3. """
  4. #
  5. # SGI image file reader/writer module
  6. #
  7. import rgbimg
  8. from imgformat import rgb, rgb_b2t, grey, grey_b2t
  9.  
  10. error = 'imgsgi.error'
  11.  
  12. class reader:
  13.     """Object that reads an SGI image file. The 'format', 'width' and
  14.     'height' attributes describe the image"""
  15.     
  16.     def __init__(self, filename):
  17.     self._filename = filename
  18.     self.width, self.height = rgbimg.sizeofimage(filename)
  19.     self.format = rgb
  20.     self.format_choices = (rgb, rgb_b2t)
  21.  
  22.     def args(self):
  23.     return self.__dict__
  24.     
  25.     def read(self):
  26.     "read the actual image data"
  27.     
  28.     if self.format == rgb:
  29.         old = rgbimg.ttob(1)
  30.     elif self.format == rgb_b2t:
  31.         old = rgbimg.ttob(0)
  32.     else:
  33.         raise error, 'Unsupported image format: '+`self.format`
  34.     data = rgbimg.longimagedata(self._filename)
  35.     rgbimg.ttob(old)
  36.     return data
  37.  
  38.     def write(self, data):
  39.     "dummy method: you cannot write to a reader object"
  40.     
  41.     raise error, 'Cannot write() to reader'
  42.  
  43. class writer:
  44.     """Object that writes an SGI image file. The 'format', 'width' and
  45.     'height' attributes describe the image"""
  46.     
  47.     def __init__(self, filename):
  48.     self._filename = filename
  49.     self.format_choices = (rgb, rgb_b2t)
  50.     self.format = rgb
  51.     self.file_format = rgb
  52.     self.file_format_choices = (rgb, rgb_b2t, grey, grey_b2t)
  53.  
  54.     def args(self):
  55.     return self.__dict__
  56.     
  57.     def _get(self, attr):
  58.     try:
  59.         return getattr(self, attr)
  60.     except AttributeError:
  61.         raise error, "Required attribute '%s' missing"%attr
  62.  
  63.     def read(self):
  64.     "dummy method: you cannot read from a writer object"
  65.     
  66.     raise error, 'Cannot read() from writer'
  67.  
  68.  
  69.     def write(self, data):
  70.     "write data to the image file"
  71.     
  72.     w = self._get('width')
  73.     h = self._get('height')
  74.  
  75.     if not self.format in (rgb, rgb_b2t):
  76.         raise error, 'Unsupported image format: '+`self.format`
  77.     if not self.file_format in (rgb, rgb_b2t, grey, grey_b2t):
  78.         raise error, 'Unsupported file format: '+`self.format`
  79.  
  80.     upside_down = 0
  81.     if self.format in (rgb_b2t, grey_b2t):
  82.         upside_down = (not upside_down)
  83.     if self.file_format in (rgb_b2t, grey_b2t):
  84.         upside_down = (not upside_down)
  85.     if upside_down:
  86.         old = rgbimg.ttob(0)
  87.     else:
  88.         old = rgbimg.ttob(1)
  89.  
  90.     if w*h*4 != len(data):
  91.         raise error, 'Incorrect datasize'
  92.  
  93.     if self.file_format in (grey, grey_b2t):
  94.         depth = 1
  95.     else:
  96.         depth = 3
  97.         
  98.     data = rgbimg.longstoimage(data, w, h, depth, self._filename)
  99.     rgbimg.ttob(old)
  100.         
  101. def _test():
  102.     rdr = reader('test.rgb')
  103.     print 'Image size is',rdr.width,'by',rdr.height
  104.     data = rdr.read()
  105.     print 'Saving output'
  106.     wr = writer('test_out.rgb')
  107.     wr.width, wr.height = rdr.width, rdr.height
  108.     wr.file_format = rgb
  109.     wr.write(data)
  110.     print 'Saving upside-down output'
  111.     wr = writer('test_out_b2t.rgb')
  112.     wr.width, wr.height = rdr.width, rdr.height
  113.     wr.file_format = rgb_b2t
  114.     wr.write(data)
  115.     print 'Saving grey output'
  116.     wr = writer('test_out_grey.rgb')
  117.     wr.width, wr.height = rdr.width, rdr.height
  118.     wr.file_format = grey
  119.     wr.write(data)
  120.     print 'Saving grey upside-down output'
  121.     wr = writer('test_out_grey_b2t.rgb')
  122.     wr.width, wr.height = rdr.width, rdr.height
  123.     wr.file_format = grey_b2t
  124.     wr.write(data)
  125.     
  126. if __name__ == '__main__':
  127.     _test()
  128.